home *** CD-ROM | disk | FTP | other *** search
- program EX_0701;
- {Listing 14P - see documentation in TUTOR.SSS}
-
- uses SSS;
- { For Pascal other than Turbo/Quick erase above line }
-
- const
- ARRIVL = 1;
- STARTA = 2;
- ENDACT = 3;
- NEXTAC = 4;
-
- ORD1 = 1;
- ORD2 = 2;
- DELUX1 = 3;
- DELUX2 = 4;
-
- { For MS Pascal $include:'SSSP1.H' }
-
- var
- s, ecode : integer;
- server : array[1..2] of integer;
-
- { For MS Pascal $include:'SSSP2.H' }
-
- procedure prime;
- begin
- server[1] := 1;
- server[2] := 1;
- INIQUE(5,3,1);
- INISTA(1,'Interrupts',0,0,0,0);
- SIMEND(60);
- CREATE(0, 0);
- end;
-
- function sindex: integer;
- begin
- if IDE < DELUX1 then sindex := IDE
- else sindex := IDE - ORD2;
- end;
-
- function shortr: integer;
- begin
- if NQ(4) + NQ(2) < NQ(3) + NQ(1) then
- SETIDE(IDE + 1);
- shortr := IDE
- end;
-
- procedure preemp;
- var i, preide: integer; remt: real;
-
- begin
- QUEUE(5, 0);
- i := 1;
- while ((i <= NC) and
- ((IDIC(i) > ORD2) or (NEIC(i) <> ENDACT))) do
- i := i + 1;
- if i <= NC then
-
- begin
- remt := TIC(i) - T;
- REMVFC(i);
- preide := IDE;
- SETA(1, A(1) + 1);
- SETA(2, remt);
- SETQDC(1,'LIFO');
- QUEUE(IDE, 0);
- SETQDC(1,'FIFO');
- REMVFQ(5,1);
- SCHED(0, STARTA, preide+2);
- end
-
- else
- begin
- REMVFQ(5,1);
- QUEUE(shortr, 0);
- end;
- end;
-
- begin
-
- prime;
-
- repeat
- ecode := NEXTEV;
- if ecode > 0 then
- begin
- case ecode of
-
- ARRIVL: begin
- CREATE(EX(2), 0);
- SETA(1, 0);
- SETA(2, TR(1,2,3));
- if RA < 0.25 then SETIDE(DELUX1)
- else SETIDE(ORD1 );
- SCHED(0, NEXTAC, IDE);
- end;
-
- NEXTAC: if server[1] > 0 then
- SCHED(0, STARTA, IDE )
- else if server[2] > 0 then
- SCHED(0, STARTA, IDE+1)
- else if IDE = DELUX1 then
- preemp
- else
- QUEUE(shortr, 0);
-
- STARTA: begin
- server[sindex] := server[sindex] - 1;
- SCHED(A(2), ENDACT, IDE);
- end;
-
- ENDACT: begin
- s := sindex;
- server[s] := server[s] + 1;
- if IDE < DELUX1 then TALLY(1, A(1));
- DISPOS;
- if NQ(s + 2) > 0 then
- begin
- REMVFQ(s + 2, 1);
- SCHED(0, STARTA, IDE);
- end
-
- else if NQ(s) > 0 then
- begin
- REMVFQ(s, 1);
- SCHED(0, STARTA, IDE);
- end;
- end;
- end;
- end;
- until ecode = 0;
-
- SUMRY('');
-
- end.